package org.springblade.application.util;/*
 *@ClassName HttpClientUtil
 *@Description 远程调用接口
 *@Author Weizy
 *@Date 2022/1/12 17:07
 **/

import com.alibaba.fastjson.JSON;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springblade.applicationapi.enums.NumberEnum;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
 * @author wzy
 */
public class HttpClientUtil {

	/**
	 * 使用httpClient发送get请求
	 * @param url get请求的url地址
	 */
	public static String doGet(String url) {
		StringBuilder result = new StringBuilder();
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse response = null;
		try {
			// 通过址默认配置创建一个httpClient实例
			httpClient = HttpClients.createDefault();
			// 创建httpGet远程连接实例
			HttpGet httpGet = new HttpGet(url);
			// 设置配置请求参数  连接主机服务超时时间
			RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)
				// 请求超时时间
				.setConnectionRequestTimeout(35000)
				// 数据读取超时时间
				.setSocketTimeout(60000)
				.build();
			// 为httpGet实例设置配置
			httpGet.setConfig(requestConfig);
			// 设置请求头
			httpGet.setHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36");
			// 执行get请求得到返回对象
			response = httpClient.execute(httpGet);
			// 通过返回对象获取返回数据
			HttpEntity entity = response.getEntity();
			// 通过EntityUtils中的toString方法将结果转换为字符串
			String html = EntityUtils.toString(entity);
			result.append(html);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != response) {
				try {
					response.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result.toString();
	}

	/**
	 * 使用httpClient发送post请求
	 * @param url  post请求url
	 * @param paramMap post请求参数
	 * @param paramType 参数类型： 1：form ,2: json字串
	 * @return String 第三方接口返回值
	 */
	public static String doPost(String url, Map<String, Object> paramMap, int paramType) throws Exception{
		StringBuilder result = new StringBuilder();
		CloseableHttpClient httpClient = null;
		CloseableHttpResponse httpResponse = null;
		// 创建httpClient实例
		httpClient = HttpClients.createDefault();
		// 创建httpPost远程连接实例
		HttpPost httpPost = new HttpPost(url);
		// 配置请求参数实例 设置连接主机服务超时时间
		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)
			// 设置连接请求超时时间
			.setConnectionRequestTimeout(35000)
			// 设置读取数据连接超时时间
			.setSocketTimeout(60000)
			.build();
		// 为httpPost实例设置配置
		httpPost.setConfig(requestConfig);
		// 设置请求头
		httpPost.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36");
		if (NumberEnum.ONE.getCode() == paramType) {
			httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded");
		} else if (NumberEnum.TWO.getCode() == paramType) {
			httpPost.addHeader("Content-Type", "application/json");
		}

		// 封装post请求参数
		if (null != paramMap && paramMap.size() > 0) {
			if (NumberEnum.ONE.getCode() == paramType) {
				List<NameValuePair> nameValuePairList = new ArrayList<>();
				for (String key : paramMap.keySet()) {
					nameValuePairList.add(new BasicNameValuePair(key, paramMap.get(key).toString()));
				}
				httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairList, "UTF-8"));
			} else if (NumberEnum.TWO.getCode() == paramType){
				String json = JSON.toJSONString(paramMap);
				// json传递
				StringEntity postingString = new StringEntity(json, "UTF-8");
				httpPost.setEntity(postingString);
			}
		}

		try {
			// httpClient对象执行post请求,并返回响应参数对象
			httpResponse = httpClient.execute(httpPost);
			// 从响应对象中获取响应内容
			HttpEntity entity = httpResponse.getEntity();
			result.append(EntityUtils.toString(entity));
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			if (null != httpResponse) {
				try {
					httpResponse.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (null != httpClient) {
				try {
					httpClient.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return result.toString();
	}


}

